package com.gxa.controller;


import com.gxa.BusinessException;
import com.gxa.utils.ErrorCode;
import lombok.extern.log4j.Log4j2;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.HashMap;
import java.util.Map;


@Log4j2
@ResponseBody
@ControllerAdvice //将当前类作为全局异常的总处理入口（类）
public class ExceptionController {

    @ExceptionHandler(Throwable.class)
    public Map advice(Throwable throwable){
//        把异常信息记录在日志文件中:
//        在没有lombok的情况下, 要想使用log4j2必须通过LogFactory
//        Log log = LogFactory.getLog("");

        // 使用@Log4j2注解后, 可以直接调用log对象了
        log.info("-----------------begin-----------------------"); //分割线方便阅读
        log.info(throwable);  // 先记录异常对象的toString状态: 包括异常类型和异常原因

        // 再遍历栈中的异常轨迹: 采用遍历方式
        StackTraceElement[] stackTrace = throwable.getStackTrace();
        for (StackTraceElement stackTraceElement : stackTrace) {
            log.info(stackTraceElement);
        }
        log.info("-------------------end---------------------");//分割线方便阅读
        Map<String,Object> responseMap = new HashMap<>();
        responseMap.put("code",500);
        responseMap.put("msg","发生未知错误,请稍后再试");
        if(throwable instanceof BusinessException){
            ErrorCode errorCode = ((BusinessException)throwable).getErrorCode();
            responseMap.put("code",errorCode.getCode());
            responseMap.put("msg",errorCode.getDesc());
        }
        return responseMap;
    }
}
